package com.macaline.util;

import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;


/**
 * 格式校验工具类
 * @author warm_joy
 */
public class ParamValidationUtil {
	
	public final static String USERNAME_PATTERN = "^[a-zA-Z0-9_]{4,15}$";
	public final static String PASSWORD_PATTERN = "^[a-zA-Z0-9]{6,16}$";
	public final static String PHONE_PATTERN = "^1[3|4|5|8|7|9][0-9]\\d{8}$";
	public final static String TELEPHONE_PATTERN = "^[0-9-]{6,16}$";
	public final static String EMAIL_PATTERN = "\\w+@\\w+(\\.\\w{2,3})*\\.\\w{2,3}";
	
	
	/**
	 * 方法用途: 对所有传入参数按照字段名的 ASCII 码从小到大排序（字典序），并且生成url参数串<br>
	 * 实现步骤: <br>
	 * @param paraMap    要排序的Map对象
	 * @param urlEncode  是否需要URLENCODE
	 * @param keyToLower 是否需要将Key转换为全小写 true:key转化成小写，false:不转化
	 * @return
	 */
	public static String formatUrlMap(Map<String, String> paraMap, boolean urlEncode, boolean keyToLower) {
		String buff = "";
		Map<String, String> tmpMap = paraMap;
		try {
			List<Map.Entry<String, String>> infoIds = new ArrayList<Map.Entry<String, String>>(tmpMap.entrySet());
			// 对所有传入参数按照字段名的 ASCII 码从小到大排序（字典序）
			Collections.sort(infoIds, new Comparator<Map.Entry<String, String>>() {
				@Override
				public int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {
					return (o1.getKey()).toString().compareTo(o2.getKey());
				}
			});
			// 构造URL 键值对的格式
			StringBuilder buf = new StringBuilder();
			for (Map.Entry<String, String> item : infoIds) {

				if (item.getKey() != null && item.getKey().length() > 0) {
					String key = item.getKey();
					String val = item.getValue();
					if (urlEncode) {
						val = URLEncoder.encode(val, "utf-8");
					}
					if (keyToLower) {
						buf.append(key.toLowerCase() + "=" + val);
					} else {
						buf.append(key + "=" + val);
					}
					buf.append("&");
				}

			}
			buff = buf.toString();
			if (buff.isEmpty() == false) {
				buff = buff.substring(0, buff.length() - 1);
			}
		} catch (Exception e) {
			return null;
		}
		return buff;
	}
	/**
	 * 检验用户输入的用户名是否合法
	 * @author warm_joy
	 * @param userName 需要被检验的用户名
	 * @return 合法返回true，否则返回false
	 */
	public static boolean isUserName(String userName) {
		return Pattern.matches(USERNAME_PATTERN, userName);
		
	}
	
	/**
	 * 检查用户输入的密码是否合法
	 * @author warm_joy
	 * @param passWord 需要被检查的密码
	 * @return 合法返回true，否则返回false
	 */
	public static boolean isPassword(String passWord) {
		return Pattern.matches(PASSWORD_PATTERN, passWord);
	}
	
	/**
	 * 校验用户输入的手机号是否合法。将会判断手机号是否是11位、以及开头是否是1
	 * @author warm_joy
	 * @param phone 需要校验的手机号，11位手机号
	 * @return 合法返回true，否则返回false
	 */
	public static boolean isPhone(String phone) {
		if(phone != null && phone.length() == 11 && phone.substring(0, 1).equals("1")){
			return true;
		}else{
			return false;
		}
	}
	
	/**
	 * 校验用户输入的办公电话是否合法
	 * @author warm_joy
	 * @param telephone 需要校验的办公电话
	 * @return 合法返回true，否则返回false
	 */
	public static boolean isTelephone(String telephone) {
		return Pattern.matches(TELEPHONE_PATTERN, telephone);
	}
	
	/**
	 * 校验用户输入的邮箱是否合法
	 * @author warm_joy
	 * @param email 需要校验的邮箱
	 * @return 合法返回true，否则返回false
	 */
	public static boolean isEmail(String email) {
		return Pattern.matches(EMAIL_PATTERN, email);
	}
	
}
